#include "matriz.h"

//Constructor por defecto

Matriz::Matriz()
{
  fils=4;
  cols=4;
}

//Constructor copia

Matriz::Matriz(const Matriz &m)
{
  *this = m;
}

//Constructor por parametro

Matriz::Matriz(int fils_ , int cols_)
{
  fils = fils_;
  cols = cols_;
  matr1 = new int*[fils];
  for(int i=0;i<fils;i++){
      matr1[i] = new int[cols];
  }
}

//Llenar aleatoriamente una matriz

void Matriz::llenar_aleatorio()
{
  //srand(time(NULL));
  for(int i=0;i<fils;i++){
    for(int j=0;j<cols;j++){
      matr1[i][j] = rand() % 30;
    }
  }

  srand(time(NULL));
}




int Matriz::mostrar(int a,int b){

     return this->matr1[a][b];
}




void Matriz::llenar(int a,int b,int c){
     this->matr1[a][b]=c;
}



 void Matriz::llevar_datos_valor1(){
     for(int i=0;i<fils;i++){
    for(int j=0;j<cols;j++){
      if(matr1[i][j]>0) matr1[i][j]=1;
      else
      matr1[i][j]=-1;
    }
  }

}







void Matriz::llenar_teclado()
{
  for(int i=0;i<fils;i++){
    cout << "Fila " << i+1 << endl;
    for(int j=0;j<cols;j++){
      cout << "Ingresa el elemento " << j+1 << endl;
      cin >>ele;
      matr1[i][j] = ele;
    }
    cout << endl;
  }

}




void Matriz::restar_identidad()
  {
  for(int i=0;i<fils;i++){
    for(int j=0;j<cols;j++){
            if(i==j){
      matr1[i][j]=matr1[i][j]-1;
      }
    }

  }

}

void Matriz::imprimir()
{
  for(int i=0;i<fils;i++){
    for(int j=0;j<cols;j++){
      cout << matr1[i][j] << " ";
    }
    cout << endl << endl;
  }
  cout << endl << endl;
}











 Matriz& Matriz::operator=(const Matriz &matr2){

  fils =matr2.fils;
  cols =matr2.cols;
  matr1 = new int*[fils];
  for(int i=0;i<fils;i++){
      matr1[i] = new int[cols];
  }
    for(int i=0;i<fils;i++){
    for(int j=0;j<cols;j++){
              matr1[i][j]=matr2.matr1[i][j];
    }

    }

return *this;

}










const Matriz Matriz::operator+ (const Matriz &matr2)
{
  Matriz matresult(fils,cols);

  for (int i=0;i<fils;i++){
    for (int j=0;j<cols;j++){
	  matresult.matr1[i][j] = matr1[i][j] + matr2.matr1[i][j];
    }
  }
  return matresult;
}

//Resta de matrices con sobrecarga de operadores
const Matriz Matriz::operator- (const Matriz &matr2)
{
  Matriz matresult(fils,cols);

  for (int i=0;i<fils;i++){
    for (int j=0;j<cols;j++){
      matresult.matr1[i][j] = matr1[i][j] - matr2.matr1[i][j];
    }
  }
  return matresult;
}

//Multiplicacion de matrices con sobrecarga de operadores

const Matriz Matriz::operator* (const Matriz &matr2)
{
  Matriz matresult(fils,matr2.cols);
  int total=0;
  for (int i=0;i<fils;i++){
    for (int j=0;j<matr2.cols;j++){
      for(int k=0;k<cols;k++){
          total += (matr1[i][k] * matr2.matr1[k][j]);
          //para mostrar lo que pasa
          /*cout << "(" << matr1[i][k] << " * " << matr2.matr1[k][j] << ")";
          if(k<cols-1){
              cout << " + ";
          } else {
              cout << " = " << total;//despues del ultimo muestro la suma
          }*/
      }
      //cout << endl;
      matresult.matr1[i][j] = total;
      total = 0;//para limpiar el total sumado arriba
    }
    cout << endl;
  }
  return matresult;
}



bool Matriz::operator!=(const Matriz &matr2){
   for(int i=0;i<fils;i++){
      for(int j=0;j<cols;j++){
         if(matr1[i][j]==matr2.matr1[i][j]){
                                      return false;

    }
  }
}
  return true;
}




Matriz::~Matriz(){

for(int i=0;i<fils;i++){
    delete[] matr1[i];
  }
  delete[] matr1;
}
